# Tori proiektua:
# :::::::::::::::::::::::::
# Sintaxia begiratzen duten
# expresio erregularrak



import re

def sortu(s):
    hasiera = "^\s*"
    bukaera = "\s*$"
    return re.compile(hasiera+s+bukaera, re.IGNORECASE)

def konparatu(l,s):
    for i in l:
        e = re.match(i,s)
        if e:
            return e
    return e

etiketa = "(\w+)\s*:\s*"
balioa = "(-?\d+)\s*(\(\s*\d+\s*\))?"
title = sortu("\.title\s+(\w+)")
word = sortu(etiketa+"\.(word)\s+(\d+)\s*;")
value= sortu(etiketa+"\.(value)\s+("+balioa+"(\s*,\s*"+balioa+")*"+")\s*;")
proc = sortu("(\.proc)\s+(\w+)")
end = sortu("(\.end)")
endp = sortu("(\.endp)\s+(\w+)")
# EZDAKITZER: 
# 3(2)
# .title adibidea -> adibidea
# HITZA: .word 5;
# BALIOA: .value 3(5),3,51,4(2),1(3);
# .proc ADIBIDEZ
# .end
# .endp main


#Argiago ikusteko aparte
koma = '\s*,\s*'
etiketa = '(\w+)'
erregistroa = '(r\d\d?|sp)'
berehalakoa = '#\s*(.+)'
helbidea = '@\s*(\d+)'
erlatiboa = '\s*\[\s*'+erregistroa+'\s*\]'
flag = '(\w+\s*:\s*)?'


aginduak = [re.compile(flag+'(in|out|retm?)$',re.I),# 0 argumentu
            re.compile(flag+'(jmp|call)\s+'+etiketa+'$',re.I),  # etiketa edo izen bat
            re.compile(flag+'(push|pop)\s+'+erregistroa+'$',re.I), 
            re.compile(flag+'(outs)\s+"(.*)"$',re.I),  # kate bat
            re.compile(flag+'(mov)\s+'+erregistroa+koma+erregistroa+'$',re.I), 
            re.compile(flag+'(ld|st|mova|bne|beq|bls|ble|bgt|bge)\s+'+erregistroa+koma+etiketa+'$',re.I), 
            re.compile(flag+'(movi)\s+'+erregistroa+koma+berehalakoa+'$',re.I), 
            re.compile(flag+'(ld|st|mova)\s+'+erregistroa+koma+helbidea+'$',re.I), 
            re.compile(flag+'(outm)\s+'+berehalakoa+koma+etiketa+'$',re.I), 
            re.compile(flag+'(outm)\s+'+berehalakoa+koma+helbidea+'$',re.I),
            re.compile(flag+'(outrm)\s+'+erregistroa+koma+berehalakoa+koma+berehalakoa+'$',re.I),
            re.compile(flag+'(add|sub|mul|div|and|or|xor)\s+'+erregistroa+koma+erregistroa+koma+erregistroa+'$',re.I),
            re.compile(flag+'(addi|subi|muli|divi|andi|ori|xori|shr|shl)\s+'+erregistroa+koma+erregistroa+koma+berehalakoa+'$',re.I),
            re.compile(flag+'(ldx|stx)\s+'+erregistroa+koma+etiketa+erlatiboa+'$',re.I),
            re.compile(flag+'(ldd|std)\s+'+erregistroa+koma+'(-?\d*)'+erlatiboa+'$',re.I)]# desplazamendua ez badago zero da



